{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：请解释 MongoDB 中的覆盖查询是什么？\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "大多数情况下，如果某个 MongoDB 检索匹配查询条件遇到了瓶颈，首先想到的是去检测查询的字段是否匹配了某个索引，这也是最简单有效的办法，但前提是你有足够的内存。会正确使用索引是使用MongoDB 的一个基本考核点。\n",
    "\n",
    "答案\n",
    "覆盖查询是以下的查询：\n",
    "\n",
    "所有的查询字段是索引的一部分；\n",
    "所有的查询返回字段在同一个索引中；\n",
    "查询字段中没有null， 比如:{\"field\" : null}或{\"field\" : {$eq : null}}\n",
    "由于所有出现在查询中的字段是索引的一部分， MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。因为索引存在于RAM中，从索引中获取数据比通过扫描文档读取数据要快得多。\n",
    "拓展\n",
    "MongoDB 覆盖查询是指使用索引且无需检查任何文档的查询。而索引的存在就是为了加速查询的。索引就好比一本书的目录，检索目录可以快速找到我们需要查找的东西，然后直奔目的地。\n",
    "\n",
    "假设我们有一个 example 集合，创建了一个联合索引，包含了字段type和item：\n",
    "\n",
    "db.example.createIndex( { type: 1, item: 1 }\n",
    "该索引将涵盖对type和item字段进行操作的查询，然后仅返回item字段。\n",
    "\n",
    "db.example.find(\n",
    "{ type: \"game\", item:/^c/ },\n",
    "{ item: 1, _id: 0 }\n",
    ")\n",
    "对于上述查询，MongoDB的不会去数据库文件中查找。相反，它会从索引中提取数据。对于指定的索引以覆盖查询，projection部分必须显式指定_id：0以从结果中排除_id字段，因为我们创建的联合索引不包含_id字段，_id在查询中会默认返回。\n",
    "\n",
    "小结\n",
    "这一章主要是针对 Python 职位中数据库相关的问题，问题可能和 Python 没有太多的关系，而且问题也比较初级，但也足够一个 Python 开发工程师应付开发任务了。在当下这个时代，是数据信息的时代，任何地方都把数据作为宝贵的资源存储起来，那么，会使用数据库必然会给你面试加分不少，尤其是云数据库。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}